﻿using System;
using System.Collections;
using System.Text;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;

namespace MQ
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建代理服务器实例。注意：HostName为Rabbit Server所在服务器的ip或域名，如果服务装在本机，则为localhost，默认端口5672
            var factory = new ConnectionFactory { HostName = "localhost", UserName = "twb", Password = "twb0223" };

            // 创建连接
            using (var connection = factory.CreateConnection())
            {
                //建立通道

                /**
                 *
                 * Connection： 就是一个TCP的连接。Producer和Consumer都是通过TCP连接到RabbitMQ Server的。以后我们可以看到，程序的起始处就是建立这个TCP连接。
                 * 
                 * Channels： 虚拟连接。它建立在上述的TCP连接中。数据流动都是在Channel中进行的。也就是说，一般情况是程序起始建立TCP连接，第二步就是建立这个Channel。
                 * 
                 * 那么，为什么使用Channel，而不是直接使用TCP连接？
                 * 
                 * 对于OS来说，建立和关闭TCP连接是有代价的，频繁的建立关闭TCP连接对于系统的性能有很大的影响，而且TCP的连接数也有限制，这也限制了系统处理高并发的能力。
                 * 但是，在TCP连接中建立Channel是没有上述代价的。对于Producer或者Consumer来说，可以并发的使用多个Channel进行Publish或者Receive。
                 * 有实验表明，1s的数据可以Publish10K的数据包。当然对于不同的硬件环境，不同的数据包大小这个数据肯定不一样，但是我只想说明，对于普通的Consumer或者Producer来说，
                 * 这已经足够了。如果不够用，你考虑的应该是如何细化split你的设计。 
                 */
                using (var channel = connection.CreateModel())
                {
                    while (true)
                    {
                        string message = string.Format("Message_{0}", Console.ReadLine());
                        var body = Encoding.UTF8.GetBytes(message);



                        channel.BasicPublish(exchange: "Eric_Exchanges_001",//exchange名称
                                             routingKey: "Eric_Queues_001",//如果存在exchange,则消息被发送到名称为hello的queue的客户端
                                             basicProperties: null,
                                             body: body);//消息体
                        Console.WriteLine("消息发送成功： {0}", message);
                    }
                }
            }
        }
    }
}
